home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2008 February / PCWFEB08.iso / Software / Freeware / Miro 1.0 / Miro_Installer.exe / xulrunner / python / locale.py < prev    next >
Encoding:
Python Source  |  2006-05-26  |  72.9 KB  |  1,563 lines

  1. """ Locale support.
  2.  
  3.     The module provides low-level access to the C lib's locale APIs
  4.     and adds high level number formatting APIs as well as a locale
  5.     aliasing engine to complement these.
  6.  
  7.     The aliasing engine includes support for many commonly used locale
  8.     names and maps them to values suitable for passing to the C lib's
  9.     setlocale() function. It also includes default encodings for all
  10.     supported locale names.
  11.  
  12. """
  13.  
  14. import sys, encodings, encodings.aliases
  15.  
  16. # Try importing the _locale module.
  17. #
  18. # If this fails, fall back on a basic 'C' locale emulation.
  19.  
  20. # Yuck:  LC_MESSAGES is non-standard:  can't tell whether it exists before
  21. # trying the import.  So __all__ is also fiddled at the end of the file.
  22. __all__ = ["setlocale","Error","localeconv","strcoll","strxfrm",
  23.            "format","str","atof","atoi","LC_CTYPE","LC_COLLATE",
  24.            "LC_TIME","LC_MONETARY","LC_NUMERIC", "LC_ALL","CHAR_MAX"]
  25.  
  26. try:
  27.  
  28.     from _locale import *
  29.  
  30. except ImportError:
  31.  
  32.     # Locale emulation
  33.  
  34.     CHAR_MAX = 127
  35.     LC_ALL = 6
  36.     LC_COLLATE = 3
  37.     LC_CTYPE = 0
  38.     LC_MESSAGES = 5
  39.     LC_MONETARY = 4
  40.     LC_NUMERIC = 1
  41.     LC_TIME = 2
  42.     Error = ValueError
  43.  
  44.     def localeconv():
  45.         """ localeconv() -> dict.
  46.             Returns numeric and monetary locale-specific parameters.
  47.         """
  48.         # 'C' locale default values
  49.         return {'grouping': [127],
  50.                 'currency_symbol': '',
  51.                 'n_sign_posn': 127,
  52.                 'p_cs_precedes': 127,
  53.                 'n_cs_precedes': 127,
  54.                 'mon_grouping': [],
  55.                 'n_sep_by_space': 127,
  56.                 'decimal_point': '.',
  57.                 'negative_sign': '',
  58.                 'positive_sign': '',
  59.                 'p_sep_by_space': 127,
  60.                 'int_curr_symbol': '',
  61.                 'p_sign_posn': 127,
  62.                 'thousands_sep': '',
  63.                 'mon_thousands_sep': '',
  64.                 'frac_digits': 127,
  65.                 'mon_decimal_point': '',
  66.                 'int_frac_digits': 127}
  67.  
  68.     def setlocale(category, value=None):
  69.         """ setlocale(integer,string=None) -> string.
  70.             Activates/queries locale processing.
  71.         """
  72.         if value not in (None, '', 'C'):
  73.             raise Error, '_locale emulation only supports "C" locale'
  74.         return 'C'
  75.  
  76.     def strcoll(a,b):
  77.         """ strcoll(string,string) -> int.
  78.             Compares two strings according to the locale.
  79.         """
  80.         return cmp(a,b)
  81.  
  82.     def strxfrm(s):
  83.         """ strxfrm(string) -> string.
  84.             Returns a string that behaves for cmp locale-aware.
  85.         """
  86.         return s
  87.  
  88. ### Number formatting APIs
  89.  
  90. # Author: Martin von Loewis
  91. # improved by Georg Brandl
  92.  
  93. #perform the grouping from right to left
  94. def _group(s, monetary=False):
  95.     conv = localeconv()
  96.     thousands_sep = conv[monetary and 'mon_thousands_sep' or 'thousands_sep']
  97.     grouping = conv[monetary and 'mon_grouping' or 'grouping']
  98.     if not grouping:
  99.         return (s, 0)
  100.     result = ""
  101.     seps = 0
  102.     spaces = ""
  103.     if s[-1] == ' ':
  104.         sp = s.find(' ')
  105.         spaces = s[sp:]
  106.         s = s[:sp]
  107.     while s and grouping:
  108.         # if grouping is -1, we are done
  109.         if grouping[0] == CHAR_MAX:
  110.             break
  111.         # 0: re-use last group ad infinitum
  112.         elif grouping[0] != 0:
  113.             #process last group
  114.             group = grouping[0]
  115.             grouping = grouping[1:]
  116.         if result:
  117.             result = s[-group:] + thousands_sep + result
  118.             seps += 1
  119.         else:
  120.             result = s[-group:]
  121.         s = s[:-group]
  122.         if s and s[-1] not in "0123456789":
  123.             # the leading string is only spaces and signs
  124.             return s + result + spaces, seps
  125.     if not result:
  126.         return s + spaces, seps
  127.     if s:
  128.         result = s + thousands_sep + result
  129.         seps += 1
  130.     return result + spaces, seps
  131.  
  132. def format(percent, value, grouping=False, monetary=False, *additional):
  133.     """Returns the locale-aware substitution of a %? specifier
  134.     (percent).
  135.  
  136.     additional is for format strings which contain one or more
  137.     '*' modifiers."""
  138.     # this is only for one-percent-specifier strings and this should be checked
  139.     if percent[0] != '%':
  140.         raise ValueError("format() must be given exactly one %char "
  141.                          "format specifier")
  142.     if additional:
  143.         formatted = percent % ((value,) + additional)
  144.     else:
  145.         formatted = percent % value
  146.     # floats and decimal ints need special action!
  147.     if percent[-1] in 'eEfFgG':
  148.         seps = 0
  149.         parts = formatted.split('.')
  150.         if grouping:
  151.             parts[0], seps = _group(parts[0], monetary=monetary)
  152.         decimal_point = localeconv()[monetary and 'mon_decimal_point'
  153.                                               or 'decimal_point']
  154.         formatted = decimal_point.join(parts)
  155.         while seps:
  156.             sp = formatted.find(' ')
  157.             if sp == -1: break
  158.             formatted = formatted[:sp] + formatted[sp+1:]
  159.             seps -= 1
  160.     elif percent[-1] in 'diu':
  161.         if grouping:
  162.             formatted = _group(formatted, monetary=monetary)[0]
  163.     return formatted
  164.  
  165. import re, operator
  166. _percent_re = re.compile(r'%(?:\((?P<key>.*?)\))?'
  167.                          r'(?P<modifiers>[-#0-9 +*.hlL]*?)[eEfFgGdiouxXcrs%]')
  168.  
  169. def format_string(f, val, grouping=False):
  170.     """Formats a string in the same way that the % formatting would use,
  171.     but takes the current locale into account.
  172.     Grouping is applied if the third parameter is true."""
  173.     percents = list(_percent_re.finditer(f))
  174.     new_f = _percent_re.sub('%s', f)
  175.  
  176.     if isinstance(val, tuple):
  177.         new_val = list(val)
  178.         i = 0
  179.         for perc in percents:
  180.             starcount = perc.group('modifiers').count('*')
  181.             new_val[i] = format(perc.group(), new_val[i], grouping, False, *new_val[i+1:i+1+starcount])
  182.             del new_val[i+1:i+1+starcount]
  183.             i += (1 + starcount)
  184.         val = tuple(new_val)
  185.     elif operator.isMappingType(val):
  186.         for perc in percents:
  187.             key = perc.group("key")
  188.             val[key] = format(perc.group(), val[key], grouping)
  189.     else:
  190.         # val is a single value
  191.         val = format(percents[0].group(), val, grouping)
  192.  
  193.     return new_f % val
  194.  
  195. def currency(val, symbol=True, grouping=False, international=False):
  196.     """Formats val according to the currency settings
  197.     in the current locale."""
  198.     conv = localeconv()
  199.  
  200.     # check for illegal values
  201.     digits = conv[international and 'int_frac_digits' or 'frac_digits']
  202.     if digits == 127:
  203.         raise ValueError("Currency formatting is not possible using "
  204.                          "the 'C' locale.")
  205.  
  206.     s = format('%%.%if' % digits, abs(val), grouping, monetary=True)
  207.     # '<' and '>' are markers if the sign must be inserted between symbol and value
  208.     s = '<' + s + '>'
  209.  
  210.     if symbol:
  211.         smb = conv[international and 'int_curr_symbol' or 'currency_symbol']
  212.         precedes = conv[val<0 and 'n_cs_precedes' or 'p_cs_precedes']
  213.         separated = conv[val<0 and 'n_sep_by_space' or 'p_sep_by_space']
  214.  
  215.         if precedes:
  216.             s = smb + (separated and ' ' or '') + s
  217.         else:
  218.             s = s + (separated and ' ' or '') + smb
  219.  
  220.     sign_pos = conv[val<0 and 'n_sign_posn' or 'p_sign_posn']
  221.     sign = conv[val<0 and 'negative_sign' or 'positive_sign']
  222.  
  223.     if sign_pos == 0:
  224.         s = '(' + s + ')'
  225.     elif sign_pos == 1:
  226.         s = sign + s
  227.     elif sign_pos == 2:
  228.         s = s + sign
  229.     elif sign_pos == 3:
  230.         s = s.replace('<', sign)
  231.     elif sign_pos == 4:
  232.         s = s.replace('>', sign)
  233.     else:
  234.         # the default if nothing specified;
  235.         # this should be the most fitting sign position
  236.         s = sign + s
  237.  
  238.     return s.replace('<', '').replace('>', '')
  239.  
  240. def str(val):
  241.     """Convert float to integer, taking the locale into account."""
  242.     return format("%.12g", val)
  243.  
  244. def atof(string, func=float):
  245.     "Parses a string as a float according to the locale settings."
  246.     #First, get rid of the grouping
  247.     ts = localeconv()['thousands_sep']
  248.     if ts:
  249.         string = string.replace(ts, '')
  250.     #next, replace the decimal point with a dot
  251.     dd = localeconv()['decimal_point']
  252.     if dd:
  253.         string = string.replace(dd, '.')
  254.     #finally, parse the string
  255.     return func(string)
  256.  
  257. def atoi(str):
  258.     "Converts a string to an integer according to the locale settings."
  259.     return atof(str, int)
  260.  
  261. def _test():
  262.     setlocale(LC_ALL, "")
  263.     #do grouping
  264.     s1 = format("%d", 123456789,1)
  265.     print s1, "is", atoi(s1)
  266.     #standard formatting
  267.     s1 = str(3.14)
  268.     print s1, "is", atof(s1)
  269.  
  270. ### Locale name aliasing engine
  271.  
  272. # Author: Marc-Andre Lemburg, mal@lemburg.com
  273. # Various tweaks by Fredrik Lundh <fredrik@pythonware.com>
  274.  
  275. # store away the low-level version of setlocale (it's
  276. # overridden below)
  277. _setlocale = setlocale
  278.  
  279. def normalize(localename):
  280.  
  281.     """ Returns a normalized locale code for the given locale
  282.         name.
  283.  
  284.         The returned locale code is formatted for use with
  285.         setlocale().
  286.  
  287.         If normalization fails, the original name is returned
  288.         unchanged.
  289.  
  290.         If the given encoding is not known, the function defaults to
  291.         the default encoding for the locale code just like setlocale()
  292.         does.
  293.  
  294.     """
  295.     # Normalize the locale name and extract the encoding
  296.     fullname = localename.lower()
  297.     if ':' in fullname:
  298.         # ':' is sometimes used as encoding delimiter.
  299.         fullname = fullname.replace(':', '.')
  300.     if '.' in fullname:
  301.         langname, encoding = fullname.split('.')[:2]
  302.         fullname = langname + '.' + encoding
  303.     else:
  304.         langname = fullname
  305.         encoding = ''
  306.  
  307.     # First lookup: fullname (possibly with encoding)
  308.     norm_encoding = encoding.replace('-', '')
  309.     norm_encoding = norm_encoding.replace('_', '')
  310.     lookup_name = langname + '.' + encoding
  311.     code = locale_alias.get(lookup_name, None)
  312.     if code is not None:
  313.         return code
  314.     #print 'first lookup failed'
  315.  
  316.     # Second try: langname (without encoding)
  317.     code = locale_alias.get(langname, None)
  318.     if code is not None:
  319.         #print 'langname lookup succeeded'
  320.         if '.' in code:
  321.             langname, defenc = code.split('.')
  322.         else:
  323.             langname = code
  324.             defenc = ''
  325.         if encoding:
  326.             # Convert the encoding to a C lib compatible encoding string
  327.             norm_encoding = encodings.normalize_encoding(encoding)
  328.             #print 'norm encoding: %r' % norm_encoding
  329.             norm_encoding = encodings.aliases.aliases.get(norm_encoding,
  330.                                                           norm_encoding)
  331.             #print 'aliased encoding: %r' % norm_encoding
  332.             encoding = locale_encoding_alias.get(norm_encoding,
  333.                                                  norm_encoding)
  334.         else:
  335.             encoding = defenc
  336.         #print 'found encoding %r' % encoding
  337.         if encoding:
  338.             return langname + '.' + encoding
  339.         else:
  340.             return langname
  341.  
  342.     else:
  343.         return localename
  344.  
  345. def _parse_localename(localename):
  346.  
  347.     """ Parses the locale code for localename and returns the
  348.         result as tuple (language code, encoding).
  349.  
  350.         The localename is normalized and passed through the locale
  351.         alias engine. A ValueError is raised in case the locale name
  352.         cannot be parsed.
  353.  
  354.         The language code corresponds to RFC 1766.  code and encoding
  355.         can be None in case the values cannot be determined or are
  356.         unknown to this implementation.
  357.  
  358.     """
  359.     code = normalize(localename)
  360.     if '@' in code:
  361.         # Deal with locale modifiers
  362.         code, modifier = code.split('@')
  363.         if modifier == 'euro' and '.' not in code:
  364.             # Assume Latin-9 for @euro locales. This is bogus,
  365.             # since some systems may use other encodings for these
  366.             # locales. Also, we ignore other modifiers.
  367.             return code, 'iso-8859-15'
  368.  
  369.     if '.' in code:
  370.         return tuple(code.split('.')[:2])
  371.     elif code == 'C':
  372.         return None, None
  373.     raise ValueError, 'unknown locale: %s' % localename
  374.  
  375. def _build_localename(localetuple):
  376.  
  377.     """ Builds a locale code from the given tuple (language code,
  378.         encoding).
  379.  
  380.         No aliasing or normalizing takes place.
  381.  
  382.     """
  383.     language, encoding = localetuple
  384.     if language is None:
  385.         language = 'C'
  386.     if encoding is None:
  387.         return language
  388.     else:
  389.         return language + '.' + encoding
  390.  
  391. def getdefaultlocale(envvars=('LC_ALL', 'LC_CTYPE', 'LANG', 'LANGUAGE')):
  392.  
  393.     """ Tries to determine the default locale settings and returns
  394.         them as tuple (language code, encoding).
  395.  
  396.         According to POSIX, a program which has not called
  397.         setlocale(LC_ALL, "") runs using the portable 'C' locale.
  398.         Calling setlocale(LC_ALL, "") lets it use the default locale as
  399.         defined by the LANG variable. Since we don't want to interfere
  400.         with the current locale setting we thus emulate the behavior
  401.         in the way described above.
  402.  
  403.         To maintain compatibility with other platforms, not only the
  404.         LANG variable is tested, but a list of variables given as
  405.         envvars parameter. The first found to be defined will be
  406.         used. envvars defaults to the search path used in GNU gettext;
  407.         it must always contain the variable name 'LANG'.
  408.  
  409.         Except for the code 'C', the language code corresponds to RFC
  410.         1766.  code and encoding can be None in case the values cannot
  411.         be determined.
  412.  
  413.     """
  414.  
  415.     try:
  416.         # check if it's supported by the _locale module
  417.         import _locale
  418.         code, encoding = _locale._getdefaultlocale()
  419.     except (ImportError, AttributeError):
  420.         pass
  421.     else:
  422.         # make sure the code/encoding values are valid
  423.         if sys.platform == "win32" and code and code[:2] == "0x":
  424.             # map windows language identifier to language name
  425.             code = windows_locale.get(int(code, 0))
  426.         # ...add other platform-specific processing here, if
  427.         # necessary...
  428.         return code, encoding
  429.  
  430.     # fall back on POSIX behaviour
  431.     import os
  432.     lookup = os.environ.get
  433.     for variable in envvars:
  434.         localename = lookup(variable,None)
  435.         if localename:
  436.             if variable == 'LANGUAGE':
  437.                 localename = localename.split(':')[0]
  438.             break
  439.     else:
  440.         localename = 'C'
  441.     return _parse_localename(localename)
  442.  
  443.  
  444. def getlocale(category=LC_CTYPE):
  445.  
  446.     """ Returns the current setting for the given locale category as
  447.         tuple (language code, encoding).
  448.  
  449.         category may be one of the LC_* value except LC_ALL. It
  450.         defaults to LC_CTYPE.
  451.  
  452.         Except for the code 'C', the language code corresponds to RFC
  453.         1766.  code and encoding can be None in case the values cannot
  454.         be determined.
  455.  
  456.     """
  457.     localename = _setlocale(category)
  458.     if category == LC_ALL and ';' in localename:
  459.         raise TypeError, 'category LC_ALL is not supported'
  460.     return _parse_localename(localename)
  461.  
  462. def setlocale(category, locale=None):
  463.  
  464.     """ Set the locale for the given category.  The locale can be
  465.         a string, a locale tuple (language code, encoding), or None.
  466.  
  467.         Locale tuples are converted to strings the locale aliasing
  468.         engine.  Locale strings are passed directly to the C lib.
  469.  
  470.         category may be given as one of the LC_* values.
  471.  
  472.     """
  473.     if locale and type(locale) is not type(""):
  474.         # convert to string
  475.         locale = normalize(_build_localename(locale))
  476.     return _setlocale(category, locale)
  477.  
  478. def resetlocale(category=LC_ALL):
  479.  
  480.     """ Sets the locale for category to the default setting.
  481.  
  482.         The default setting is determined by calling
  483.         getdefaultlocale(). category defaults to LC_ALL.
  484.  
  485.     """
  486.     _setlocale(category, _build_localename(getdefaultlocale()))
  487.  
  488. if sys.platform in ('win32', 'darwin', 'mac'):
  489.     # On Win32, this will return the ANSI code page
  490.     # On the Mac, it should return the system encoding;
  491.     # it might return "ascii" instead
  492.     def getpreferredencoding(do_setlocale = True):
  493.         """Return the charset that the user is likely using."""
  494.         import _locale
  495.         return _locale._getdefaultlocale()[1]
  496. else:
  497.     # On Unix, if CODESET is available, use that.
  498.     try:
  499.         CODESET
  500.     except NameError:
  501.         # Fall back to parsing environment variables :-(
  502.         def getpreferredencoding(do_setlocale = True):
  503.             """Return the charset that the user is likely using,
  504.             by looking at environment variables."""
  505.             return getdefaultlocale()[1]
  506.     else:
  507.         def getpreferredencoding(do_setlocale = True):
  508.             """Return the charset that the user is likely using,
  509.             according to the system configuration."""
  510.             if do_setlocale:
  511.                 oldloc = setlocale(LC_CTYPE)
  512.                 setlocale(LC_CTYPE, "")
  513.                 result = nl_langinfo(CODESET)
  514.                 setlocale(LC_CTYPE, oldloc)
  515.                 return result
  516.             else:
  517.                 return nl_langinfo(CODESET)
  518.  
  519.  
  520. ### Database
  521. #
  522. # The following data was extracted from the locale.alias file which
  523. # comes with X11 and then hand edited removing the explicit encoding
  524. # definitions and adding some more aliases. The file is usually
  525. # available as /usr/lib/X11/locale/locale.alias.
  526. #
  527.  
  528. #
  529. # The local_encoding_alias table maps lowercase encoding alias names
  530. # to C locale encoding names (case-sensitive). Note that normalize()
  531. # first looks up the encoding in the encodings.aliases dictionary and
  532. # then applies this mapping to find the correct C lib name for the
  533. # encoding.
  534. #
  535. locale_encoding_alias = {
  536.  
  537.     # Mappings for non-standard encoding names used in locale names
  538.     '437':                          'C',
  539.     'c':                            'C',
  540.     'en':                           'ISO8859-1',
  541.     'jis':                          'JIS7',
  542.     'jis7':                         'JIS7',
  543.     'ajec':                         'eucJP',
  544.  
  545.     # Mappings from Python codec names to C lib encoding names
  546.     'ascii':                        'ISO8859-1',
  547.     'latin_1':                      'ISO8859-1',
  548.     'iso8859_1':                    'ISO8859-1',
  549.     'iso8859_10':                   'ISO8859-10',
  550.     'iso8859_11':                   'ISO8859-11',
  551.     'iso8859_13':                   'ISO8859-13',
  552.     'iso8859_14':                   'ISO8859-14',
  553.     'iso8859_15':                   'ISO8859-15',
  554.     'iso8859_2':                    'ISO8859-2',
  555.     'iso8859_3':                    'ISO8859-3',
  556.     'iso8859_4':                    'ISO8859-4',
  557.     'iso8859_5':                    'ISO8859-5',
  558.     'iso8859_6':                    'ISO8859-6',
  559.     'iso8859_7':                    'ISO8859-7',
  560.     'iso8859_8':                    'ISO8859-8',
  561.     'iso8859_9':                    'ISO8859-9',
  562.     'iso2022_jp':                   'JIS7',
  563.     'shift_jis':                    'SJIS',
  564.     'tactis':                       'TACTIS',
  565.     'euc_jp':                       'eucJP',
  566.     'euc_kr':                       'eucKR',
  567.     'utf_8':                        'UTF8',
  568.     'koi8_r':                       'KOI8-R',
  569.     'koi8_u':                       'KOI8-U',
  570.     # XXX This list is still incomplete. If you know more
  571.     # mappings, please file a bug report. Thanks.
  572. }
  573.  
  574. #
  575. # The locale_alias table maps lowercase alias names to C locale names
  576. # (case-sensitive). Encodings are always separated from the locale
  577. # name using a dot ('.'); they should only be given in case the
  578. # language name is needed to interpret the given encoding alias
  579. # correctly (CJK codes often have this need).
  580. #
  581. # Note that the normalize() function which uses this tables
  582. # removes '_' and '-' characters from the encoding part of the
  583. # locale name before doing the lookup. This saves a lot of
  584. # space in the table.
  585. #
  586. # MAL 2004-12-10:
  587. # Updated alias mapping to most recent locale.alias file
  588. # from X.org distribution using makelocalealias.py.
  589. #
  590. # These are the differences compared to the old mapping (Python 2.4
  591. # and older):
  592. #
  593. #    updated 'bg' -> 'bg_BG.ISO8859-5' to 'bg_BG.CP1251'
  594. #    updated 'bg_bg' -> 'bg_BG.ISO8859-5' to 'bg_BG.CP1251'
  595. #    updated 'bulgarian' -> 'bg_BG.ISO8859-5' to 'bg_BG.CP1251'
  596. #    updated 'cz' -> 'cz_CZ.ISO8859-2' to 'cs_CZ.ISO8859-2'
  597. #    updated 'cz_cz' -> 'cz_CZ.ISO8859-2' to 'cs_CZ.ISO8859-2'
  598. #    updated 'czech' -> 'cs_CS.ISO8859-2' to 'cs_CZ.ISO8859-2'
  599. #    updated 'dutch' -> 'nl_BE.ISO8859-1' to 'nl_NL.ISO8859-1'
  600. #    updated 'et' -> 'et_EE.ISO8859-4' to 'et_EE.ISO8859-15'
  601. #    updated 'et_ee' -> 'et_EE.ISO8859-4' to 'et_EE.ISO8859-15'
  602. #    updated 'fi' -> 'fi_FI.ISO8859-1' to 'fi_FI.ISO8859-15'
  603. #    updated 'fi_fi' -> 'fi_FI.ISO8859-1' to 'fi_FI.ISO8859-15'
  604. #    updated 'iw' -> 'iw_IL.ISO8859-8' to 'he_IL.ISO8859-8'
  605. #    updated 'iw_il' -> 'iw_IL.ISO8859-8' to 'he_IL.ISO8859-8'
  606. #    updated 'japanese' -> 'ja_JP.SJIS' to 'ja_JP.eucJP'
  607. #    updated 'lt' -> 'lt_LT.ISO8859-4' to 'lt_LT.ISO8859-13'
  608. #    updated 'lv' -> 'lv_LV.ISO8859-4' to 'lv_LV.ISO8859-13'
  609. #    updated 'sl' -> 'sl_CS.ISO8859-2' to 'sl_SI.ISO8859-2'
  610. #    updated 'slovene' -> 'sl_CS.ISO8859-2' to 'sl_SI.ISO8859-2'
  611. #    updated 'th_th' -> 'th_TH.TACTIS' to 'th_TH.ISO8859-11'
  612. #    updated 'zh_cn' -> 'zh_CN.eucCN' to 'zh_CN.gb2312'
  613. #    updated 'zh_cn.big5' -> 'zh_TW.eucTW' to 'zh_TW.big5'
  614. #    updated 'zh_tw' -> 'zh_TW.eucTW' to 'zh_TW.big5'
  615. #
  616. locale_alias = {
  617.     'a3':                                   'a3_AZ.KOI8-C',
  618.     'a3_az':                                'a3_AZ.KOI8-C',
  619.     'a3_az.koi8c':                          'a3_AZ.KOI8-C',
  620.     'af':                                   'af_ZA.ISO8859-1',
  621.     'af_za':                                'af_ZA.ISO8859-1',
  622.     'af_za.iso88591':                       'af_ZA.ISO8859-1',
  623.     'am':                                   'am_ET.UTF-8',
  624.     'american':                             'en_US.ISO8859-1',
  625.     'american.iso88591':                    'en_US.ISO8859-1',
  626.     'ar':                                   'ar_AA.ISO8859-6',
  627.     'ar_aa':                                'ar_AA.ISO8859-6',
  628.     'ar_aa.iso88596':                       'ar_AA.ISO8859-6',
  629.     'ar_ae':                                'ar_AE.ISO8859-6',
  630.     'ar_bh':                                'ar_BH.ISO8859-6',
  631.     'ar_dz':                                'ar_DZ.ISO8859-6',
  632.     'ar_eg':                                'ar_EG.ISO8859-6',
  633.     'ar_eg.iso88596':                       'ar_EG.ISO8859-6',
  634.     'ar_iq':                                'ar_IQ.ISO8859-6',
  635.     'ar_jo':                                'ar_JO.ISO8859-6',
  636.     'ar_kw':                                'ar_KW.ISO8859-6',
  637.     'ar_lb':                                'ar_LB.ISO8859-6',
  638.     'ar_ly':                                'ar_LY.ISO8859-6',
  639.     'ar_ma':                                'ar_MA.ISO8859-6',
  640.     'ar_om':                                'ar_OM.ISO8859-6',
  641.     'ar_qa':                                'ar_QA.ISO8859-6',
  642.     'ar_sa':                                'ar_SA.ISO8859-6',
  643.     'ar_sa.iso88596':                       'ar_SA.ISO8859-6',
  644.     'ar_sd':                                'ar_SD.ISO8859-6',
  645.     'ar_sy':                                'ar_SY.ISO8859-6',
  646.     'ar_tn':                                'ar_TN.ISO8859-6',
  647.     'ar_ye':                                'ar_YE.ISO8859-6',
  648.     'arabic':                               'ar_AA.ISO8859-6',
  649.     'arabic.iso88596':                      'ar_AA.ISO8859-6',
  650.     'az':                                   'az_AZ.ISO8859-9E',
  651.     'az_az':                                'az_AZ.ISO8859-9E',
  652.     'az_az.iso88599e':                      'az_AZ.ISO8859-9E',
  653.     'be':                                   'be_BY.CP1251',
  654.     'be_by':                                'be_BY.CP1251',
  655.     'be_by.cp1251':                         'be_BY.CP1251',
  656.     'be_by.microsoftcp1251':                'be_BY.CP1251',
  657.     'bg':                                   'bg_BG.CP1251',
  658.     'bg_bg':                                'bg_BG.CP1251',
  659.     'bg_bg.cp1251':                         'bg_BG.CP1251',
  660.     'bg_bg.iso88595':                       'bg_BG.ISO8859-5',
  661.     'bg_bg.koi8r':                          'bg_BG.KOI8-R',
  662.     'bg_bg.microsoftcp1251':                'bg_BG.CP1251',
  663.     'bokmal':                               'nb_NO.ISO8859-1',
  664.     'bokm\xe5l':                            'nb_NO.ISO8859-1',
  665.     'br':                                   'br_FR.ISO8859-1',
  666.     'br_fr':                                'br_FR.ISO8859-1',
  667.     'br_fr.iso88591':                       'br_FR.ISO8859-1',
  668.     'br_fr.iso885914':                      'br_FR.ISO8859-14',
  669.     'br_fr.iso885915':                      'br_FR.ISO8859-15',
  670.     'br_fr@euro':                           'br_FR.ISO8859-15',
  671.     'bulgarian':                            'bg_BG.CP1251',
  672.     'c':                                    'C',
  673.     'c-french':                             'fr_CA.ISO8859-1',
  674.     'c-french.iso88591':                    'fr_CA.ISO8859-1',
  675.     'c.en':                                 'C',
  676.     'c.iso88591':                           'en_US.ISO8859-1',
  677.     'c_c':                                  'C',
  678.     'c_c.c':                                'C',
  679.     'ca':                                   'ca_ES.ISO8859-1',
  680.     'ca_es':                                'ca_ES.ISO8859-1',
  681.     'ca_es.iso88591':                       'ca_ES.ISO8859-1',
  682.     'ca_es.iso885915':                      'ca_ES.ISO8859-15',
  683.     'ca_es@euro':                           'ca_ES.ISO8859-15',
  684.     'catalan':                              'ca_ES.ISO8859-1',
  685.     'cextend':                              'en_US.ISO8859-1',
  686.     'cextend.en':                           'en_US.ISO8859-1',
  687.     'chinese-s':                            'zh_CN.eucCN',
  688.     'chinese-t':                            'zh_TW.eucTW',
  689.     'croatian':                             'hr_HR.ISO8859-2',
  690.     'cs':                                   'cs_CZ.ISO8859-2',
  691.     'cs_cs':                                'cs_CZ.ISO8859-2',
  692.     'cs_cs.iso88592':                       'cs_CZ.ISO8859-2',
  693.     'cs_cz':                                'cs_CZ.ISO8859-2',
  694.     'cs_cz.iso88592':                       'cs_CZ.ISO8859-2',
  695.     'cy':                                   'cy_GB.ISO8859-1',
  696.     'cy_gb':                                'cy_GB.ISO8859-1',
  697.     'cy_gb.iso88591':                       'cy_GB.ISO8859-1',
  698.     'cy_gb.iso885914':                      'cy_GB.ISO8859-14',
  699.     'cy_gb.iso885915':                      'cy_GB.ISO8859-15',
  700.     'cy_gb@euro':                           'cy_GB.ISO8859-15',
  701.     'cz':                                   'cs_CZ.ISO8859-2',
  702.     'cz_cz':                                'cs_CZ.ISO8859-2',
  703.     'czech':                                'cs_CZ.ISO8859-2',
  704.     'da':                                   'da_DK.ISO8859-1',
  705.     'da_dk':                                'da_DK.ISO8859-1',
  706.     'da_dk.88591':                          'da_DK.ISO8859-1',
  707.     'da_dk.885915':                         'da_DK.ISO8859-15',
  708.     'da_dk.iso88591':                       'da_DK.ISO8859-1',
  709.     'da_dk.iso885915':                      'da_DK.ISO8859-15',
  710.     'da_dk@euro':                           'da_DK.ISO8859-15',
  711.     'danish':                               'da_DK.ISO8859-1',
  712.     'danish.iso88591':                      'da_DK.ISO8859-1',
  713.     'dansk':                                'da_DK.ISO8859-1',
  714.     'de':                                   'de_DE.ISO8859-1',
  715.     'de_at':                                'de_AT.ISO8859-1',
  716.     'de_at.iso88591':                       'de_AT.ISO8859-1',
  717.     'de_at.iso885915':                      'de_AT.ISO8859-15',
  718.     'de_at@euro':                           'de_AT.ISO8859-15',
  719.     'de_be':                                'de_BE.ISO8859-1',
  720.     'de_be.iso88591':                       'de_BE.ISO8859-1',
  721.     'de_be.iso885915':                      'de_BE.ISO8859-15',
  722.     'de_be@euro':                           'de_BE.ISO8859-15',
  723.     'de_ch':                                'de_CH.ISO8859-1',
  724.     'de_ch.iso88591':                       'de_CH.ISO8859-1',
  725.     'de_ch.iso885915':                      'de_CH.ISO8859-15',
  726.     'de_ch@euro':                           'de_CH.ISO8859-15',
  727.     'de_de':                                'de_DE.ISO8859-1',
  728.     'de_de.88591':                          'de_DE.ISO8859-1',
  729.     'de_de.885915':                         'de_DE.ISO8859-15',
  730.     'de_de.885915@euro':                    'de_DE.ISO8859-15',
  731.     'de_de.iso88591':                       'de_DE.ISO8859-1',
  732.     'de_de.iso885915':                      'de_DE.ISO8859-15',
  733.     'de_de@euro':                           'de_DE.ISO8859-15',
  734.     'de_lu':                                'de_LU.ISO8859-1',
  735.     'de_lu.iso88591':                       'de_LU.ISO8859-1',
  736.     'de_lu.iso885915':                      'de_LU.ISO8859-15',
  737.     'de_lu@euro':                           'de_LU.ISO8859-15',
  738.     'deutsch':                              'de_DE.ISO8859-1',
  739.     'dutch':                                'nl_NL.ISO8859-1',
  740.     'dutch.iso88591':                       'nl_BE.ISO8859-1',
  741.     'ee':                                   'ee_EE.ISO8859-4',
  742.     'ee_ee':                                'ee_EE.ISO8859-4',
  743.     'ee_ee.iso88594':                       'ee_EE.ISO8859-4',
  744.     'eesti':                                'et_EE.ISO8859-1',
  745.     'el':                                   'el_GR.ISO8859-7',
  746.     'el_gr':                                'el_GR.ISO8859-7',
  747.     'el_gr.iso88597':                       'el_GR.ISO8859-7',
  748.     'el_gr@euro':                           'el_GR.ISO8859-15',
  749.     'en':                                   'en_US.ISO8859-1',
  750.     'en.iso88591':                          'en_US.ISO8859-1',
  751.     'en_au':                                'en_AU.ISO8859-1',
  752.     'en_au.iso88591':                       'en_AU.ISO8859-1',
  753.     'en_be':                                'en_BE.ISO8859-1',
  754.     'en_be@euro':                           'en_BE.ISO8859-15',
  755.     'en_bw':                                'en_BW.ISO8859-1',
  756.     'en_ca':                                'en_CA.ISO8859-1',
  757.     'en_ca.iso88591':                       'en_CA.ISO8859-1',
  758.     'en_gb':                                'en_GB.ISO8859-1',
  759.     'en_gb.88591':                          'en_GB.ISO8859-1',
  760.     'en_gb.iso88591':                       'en_GB.ISO8859-1',
  761.     'en_gb.iso885915':                      'en_GB.ISO8859-15',
  762.     'en_gb@euro':                           'en_GB.ISO8859-15',
  763.     'en_hk':                                'en_HK.ISO8859-1',
  764.     'en_ie':                                'en_IE.ISO8859-1',
  765.     'en_ie.iso88591':                       'en_IE.ISO8859-1',
  766.     'en_ie.iso885915':                      'en_IE.ISO8859-15',
  767.     'en_ie@euro':                           'en_IE.ISO8859-15',
  768.     'en_in':                                'en_IN.ISO8859-1',
  769.     'en_nz':                                'en_NZ.ISO8859-1',
  770.     'en_nz.iso88591':                       'en_NZ.ISO8859-1',
  771.     'en_ph':                                'en_PH.ISO8859-1',
  772.     'en_sg':                                'en_SG.ISO8859-1',
  773.     'en_uk':                                'en_GB.ISO8859-1',
  774.     'en_us':                                'en_US.ISO8859-1',
  775.     'en_us.88591':                          'en_US.ISO8859-1',
  776.     'en_us.885915':                         'en_US.ISO8859-15',
  777.     'en_us.iso88591':                       'en_US.ISO8859-1',
  778.     'en_us.iso885915':                      'en_US.ISO8859-15',
  779.     'en_us.iso885915@euro':                 'en_US.ISO8859-15',
  780.     'en_us@euro':                           'en_US.ISO8859-15',
  781.     'en_us@euro@euro':                      'en_US.ISO8859-15',
  782.     'en_za':                                'en_ZA.ISO8859-1',
  783.     'en_za.88591':                          'en_ZA.ISO8859-1',
  784.     'en_za.iso88591':                       'en_ZA.ISO8859-1',
  785.     'en_za.iso885915':                      'en_ZA.ISO8859-15',
  786.     'en_za@euro':                           'en_ZA.ISO8859-15',
  787.     'en_zw':                                'en_ZW.ISO8859-1',
  788.     'eng_gb':                               'en_GB.ISO8859-1',
  789.     'eng_gb.8859':                          'en_GB.ISO8859-1',
  790.     'english':                              'en_EN.ISO8859-1',
  791.     'english.iso88591':                     'en_EN.ISO8859-1',
  792.     'english_uk':                           'en_GB.ISO8859-1',
  793.     'english_uk.8859':                      'en_GB.ISO8859-1',
  794.     'english_united-states':                'en_US.ISO8859-1',
  795.     'english_united-states.437':            'C',
  796.     'english_us':                           'en_US.ISO8859-1',
  797.     'english_us.8859':                      'en_US.ISO8859-1',
  798.     'english_us.ascii':                     'en_US.ISO8859-1',
  799.     'eo':                                   'eo_XX.ISO8859-3',
  800.     'eo_eo':                                'eo_EO.ISO8859-3',
  801.     'eo_eo.iso88593':                       'eo_EO.ISO8859-3',
  802.     'eo_xx':                                'eo_XX.ISO8859-3',
  803.     'eo_xx.iso88593':                       'eo_XX.ISO8859-3',
  804.     'es':                                   'es_ES.ISO8859-1',
  805.     'es_ar':                                'es_AR.ISO8859-1',
  806.     'es_ar.iso88591':                       'es_AR.ISO8859-1',
  807.     'es_bo':                                'es_BO.ISO8859-1',
  808.     'es_bo.iso88591':                       'es_BO.ISO8859-1',
  809.     'es_cl':                                'es_CL.ISO8859-1',
  810.     'es_cl.iso88591':                       'es_CL.ISO8859-1',
  811.     'es_co':                                'es_CO.ISO8859-1',
  812.     'es_co.iso88591':                       'es_CO.ISO8859-1',
  813.     'es_cr':                                'es_CR.ISO8859-1',
  814.     'es_cr.iso88591':                       'es_CR.ISO8859-1',
  815.     'es_do':                                'es_DO.ISO8859-1',
  816.     'es_do.iso88591':                       'es_DO.ISO8859-1',
  817.     'es_ec':                                'es_EC.ISO8859-1',
  818.     'es_ec.iso88591':                       'es_EC.ISO8859-1',
  819.     'es_es':                                'es_ES.ISO8859-1',
  820.     'es_es.88591':                          'es_ES.ISO8859-1',
  821.     'es_es.iso88591':                       'es_ES.ISO8859-1',
  822.     'es_es.iso885915':                      'es_ES.ISO8859-15',
  823.     'es_es@euro':                           'es_ES.ISO8859-15',
  824.     'es_gt':                                'es_GT.ISO8859-1',
  825.     'es_gt.iso88591':                       'es_GT.ISO8859-1',
  826.     'es_hn':                                'es_HN.ISO8859-1',
  827.     'es_hn.iso88591':                       'es_HN.ISO8859-1',
  828.     'es_mx':                                'es_MX.ISO8859-1',
  829.     'es_mx.iso88591':                       'es_MX.ISO8859-1',
  830.     'es_ni':                                'es_NI.ISO8859-1',
  831.     'es_ni.iso88591':                       'es_NI.ISO8859-1',
  832.     'es_pa':                                'es_PA.ISO8859-1',
  833.     'es_pa.iso88591':                       'es_PA.ISO8859-1',
  834.     'es_pa.iso885915':                      'es_PA.ISO8859-15',
  835.     'es_pa@euro':                           'es_PA.ISO8859-15',
  836.     'es_pe':                                'es_PE.ISO8859-1',
  837.     'es_pe.iso88591':                       'es_PE.ISO8859-1',
  838.     'es_pe.iso885915':                      'es_PE.ISO8859-15',
  839.     'es_pe@euro':                           'es_PE.ISO8859-15',
  840.     'es_pr':                                'es_PR.ISO8859-1',
  841.     'es_pr.iso88591':                       'es_PR.ISO8859-1',
  842.     'es_py':                                'es_PY.ISO8859-1',
  843.     'es_py.iso88591':                       'es_PY.ISO8859-1',
  844.     'es_py.iso885915':                      'es_PY.ISO8859-15',
  845.     'es_py@euro':                           'es_PY.ISO8859-15',
  846.     'es_sv':                                'es_SV.ISO8859-1',
  847.     'es_sv.iso88591':                       'es_SV.ISO8859-1',
  848.     'es_sv.iso885915':                      'es_SV.ISO8859-15',
  849.     'es_sv@euro':                           'es_SV.ISO8859-15',
  850.     'es_us':                                'es_US.ISO8859-1',
  851.     'es_uy':                                'es_UY.ISO8859-1',
  852.     'es_uy.iso88591':                       'es_UY.ISO8859-1',
  853.     'es_uy.iso885915':                      'es_UY.ISO8859-15',
  854.     'es_uy@euro':                           'es_UY.ISO8859-15',
  855.     'es_ve':                                'es_VE.ISO8859-1',
  856.     'es_ve.iso88591':                       'es_VE.ISO8859-1',
  857.     'es_ve.iso885915':                      'es_VE.ISO8859-15',
  858.     'es_ve@euro':                           'es_VE.ISO8859-15',
  859.     'estonian':                             'et_EE.ISO8859-1',
  860.     'et':                                   'et_EE.ISO8859-15',
  861.     'et_ee':                                'et_EE.ISO8859-15',
  862.     'et_ee.iso88591':                       'et_EE.ISO8859-1',
  863.     'et_ee.iso885913':                      'et_EE.ISO8859-13',
  864.     'et_ee.iso885915':                      'et_EE.ISO8859-15',
  865.     'et_ee.iso88594':                       'et_EE.ISO8859-4',
  866.     'et_ee@euro':                           'et_EE.ISO8859-15',
  867.     'eu':                                   'eu_ES.ISO8859-1',
  868.     'eu_es':                                'eu_ES.ISO8859-1',
  869.     'eu_es.iso88591':                       'eu_ES.ISO8859-1',
  870.     'eu_es.iso885915':                      'eu_ES.ISO8859-15',
  871.     'eu_es@euro':                           'eu_ES.ISO8859-15',
  872.     'fa':                                   'fa_IR.UTF-8',
  873.     'fa_ir':                                'fa_IR.UTF-8',
  874.     'fa_ir.isiri3342':                      'fa_IR.ISIRI-3342',
  875.     'fi':                                   'fi_FI.ISO8859-15',
  876.     'fi_fi':                                'fi_FI.ISO8859-15',
  877.     'fi_fi.88591':                          'fi_FI.ISO8859-1',
  878.     'fi_fi.iso88591':                       'fi_FI.ISO8859-1',
  879.     'fi_fi.iso885915':                      'fi_FI.ISO8859-15',
  880.     'fi_fi.utf8@euro':                      'fi_FI.UTF-8',
  881.     'fi_fi@euro':                           'fi_FI.ISO8859-15',
  882.     'finnish':                              'fi_FI.ISO8859-1',
  883.     'finnish.iso88591':                     'fi_FI.ISO8859-1',
  884.     'fo':                                   'fo_FO.ISO8859-1',
  885.     'fo_fo':                                'fo_FO.ISO8859-1',
  886.     'fo_fo.iso88591':                       'fo_FO.ISO8859-1',
  887.     'fo_fo.iso885915':                      'fo_FO.ISO8859-15',
  888.     'fo_fo@euro':                           'fo_FO.ISO8859-15',
  889.     'fr':                                   'fr_FR.ISO8859-1',
  890.     'fr_be':                                'fr_BE.ISO8859-1',
  891.     'fr_be.88591':                          'fr_BE.ISO8859-1',
  892.     'fr_be.iso88591':                       'fr_BE.ISO8859-1',
  893.     'fr_be.iso885915':                      'fr_BE.ISO8859-15',
  894.     'fr_be@euro':                           'fr_BE.ISO8859-15',
  895.     'fr_ca':                                'fr_CA.ISO8859-1',
  896.     'fr_ca.88591':                          'fr_CA.ISO8859-1',
  897.     'fr_ca.iso88591':                       'fr_CA.ISO8859-1',
  898.     'fr_ca.iso885915':                      'fr_CA.ISO8859-15',
  899.     'fr_ca@euro':                           'fr_CA.ISO8859-15',
  900.     'fr_ch':                                'fr_CH.ISO8859-1',
  901.     'fr_ch.88591':                          'fr_CH.ISO8859-1',
  902.     'fr_ch.iso88591':                       'fr_CH.ISO8859-1',
  903.     'fr_ch.iso885915':                      'fr_CH.ISO8859-15',
  904.     'fr_ch@euro':                           'fr_CH.ISO8859-15',
  905.     'fr_fr':                                'fr_FR.ISO8859-1',
  906.     'fr_fr.88591':                          'fr_FR.ISO8859-1',
  907.     'fr_fr.iso88591':                       'fr_FR.ISO8859-1',
  908.     'fr_fr.iso885915':                      'fr_FR.ISO8859-15',
  909.     'fr_fr@euro':                           'fr_FR.ISO8859-15',
  910.     'fr_lu':                                'fr_LU.ISO8859-1',
  911.     'fr_lu.88591':                          'fr_LU.ISO8859-1',
  912.     'fr_lu.iso88591':                       'fr_LU.ISO8859-1',
  913.     'fr_lu.iso885915':                      'fr_LU.ISO8859-15',
  914.     'fr_lu@euro':                           'fr_LU.ISO8859-15',
  915.     'fran\xe7ais':                          'fr_FR.ISO8859-1',
  916.     'fre_fr':                               'fr_FR.ISO8859-1',
  917.     'fre_fr.8859':                          'fr_FR.ISO8859-1',
  918.     'french':                               'fr_FR.ISO8859-1',
  919.     'french.iso88591':                      'fr_CH.ISO8859-1',
  920.     'french_france':                        'fr_FR.ISO8859-1',
  921.     'french_france.8859':                   'fr_FR.ISO8859-1',
  922.     'ga':                                   'ga_IE.ISO8859-1',
  923.     'ga_ie':                                'ga_IE.ISO8859-1',
  924.     'ga_ie.iso88591':                       'ga_IE.ISO8859-1',
  925.     'ga_ie.iso885914':                      'ga_IE.ISO8859-14',
  926.     'ga_ie.iso885915':                      'ga_IE.ISO8859-15',
  927.     'ga_ie@euro':                           'ga_IE.ISO8859-15',
  928.     'galego':                               'gl_ES.ISO8859-1',
  929.     'galician':                             'gl_ES.ISO8859-1',
  930.     'gd':                                   'gd_GB.ISO8859-1',
  931.     'gd_gb':                                'gd_GB.ISO8859-1',
  932.     'gd_gb.iso88591':                       'gd_GB.ISO8859-1',
  933.     'gd_gb.iso885914':                      'gd_GB.ISO8859-14',
  934.     'gd_gb.iso885915':                      'gd_GB.ISO8859-15',
  935.     'gd_gb@euro':                           'gd_GB.ISO8859-15',
  936.     'ger_de':                               'de_DE.ISO8859-1',
  937.     'ger_de.8859':                          'de_DE.ISO8859-1',
  938.     'german':                               'de_DE.ISO8859-1',
  939.     'german.iso88591':                      'de_CH.ISO8859-1',
  940.     'german_germany':                       'de_DE.ISO8859-1',
  941.     'german_germany.8859':                  'de_DE.ISO8859-1',
  942.     'gl':                                   'gl_ES.ISO8859-1',
  943.     'gl_es':                                'gl_ES.ISO8859-1',
  944.     'gl_es.iso88591':                       'gl_ES.ISO8859-1',
  945.     'gl_es.iso885915':                      'gl_ES.ISO8859-15',
  946.     'gl_es@euro':                           'gl_ES.ISO8859-15',
  947.     'greek':                                'el_GR.ISO8859-7',
  948.     'greek.iso88597':                       'el_GR.ISO8859-7',
  949.     'gv':                                   'gv_GB.ISO8859-1',
  950.     'gv_gb':                                'gv_GB.ISO8859-1',
  951.     'gv_gb.iso88591':                       'gv_GB.ISO8859-1',
  952.     'gv_gb.iso885914':                      'gv_GB.ISO8859-14',
  953.     'gv_gb.iso885915':                      'gv_GB.ISO8859-15',
  954.     'gv_gb@euro':                           'gv_GB.ISO8859-15',
  955.     'he':                                   'he_IL.ISO8859-8',
  956.     'he_il':                                'he_IL.ISO8859-8',
  957.     'he_il.cp1255':                         'he_IL.CP1255',
  958.     'he_il.iso88598':                       'he_IL.ISO8859-8',
  959.     'he_il.microsoftcp1255':                'he_IL.CP1255',
  960.     'hebrew':                               'iw_IL.ISO8859-8',
  961.     'hebrew.iso88598':                      'iw_IL.ISO8859-8',
  962.     'hi':                                   'hi_IN.ISCII-DEV',
  963.     'hi_in':                                'hi_IN.ISCII-DEV',
  964.     'hi_in.isciidev':                       'hi_IN.ISCII-DEV',
  965.     'hr':                                   'hr_HR.ISO8859-2',
  966.     'hr_hr':                                'hr_HR.ISO8859-2',
  967.     'hr_hr.iso88592':                       'hr_HR.ISO8859-2',
  968.     'hrvatski':                             'hr_HR.ISO8859-2',
  969.     'hu':                                   'hu_HU.ISO8859-2',
  970.     'hu_hu':                                'hu_HU.ISO8859-2',
  971.     'hu_hu.iso88592':                       'hu_HU.ISO8859-2',
  972.     'hungarian':                            'hu_HU.ISO8859-2',
  973.     'icelandic':                            'is_IS.ISO8859-1',
  974.     'icelandic.iso88591':                   'is_IS.ISO8859-1',
  975.     'id':                                   'id_ID.ISO8859-1',
  976.     'id_id':                                'id_ID.ISO8859-1',
  977.     'in':                                   'id_ID.ISO8859-1',
  978.     'in_id':                                'id_ID.ISO8859-1',
  979.     'is':                                   'is_IS.ISO8859-1',
  980.     'is_is':                                'is_IS.ISO8859-1',
  981.     'is_is.iso88591':                       'is_IS.ISO8859-1',
  982.     'is_is.iso885915':                      'is_IS.ISO8859-15',
  983.     'is_is@euro':                           'is_IS.ISO8859-15',
  984.     'iso-8859-1':                           'en_US.ISO8859-1',
  985.     'iso-8859-15':                          'en_US.ISO8859-15',
  986.     'iso8859-1':                            'en_US.ISO8859-1',
  987.     'iso8859-15':                           'en_US.ISO8859-15',
  988.     'iso_8859_1':                           'en_US.ISO8859-1',
  989.     'iso_8859_15':                          'en_US.ISO8859-15',
  990.     'it':                                   'it_IT.ISO8859-1',
  991.     'it_ch':                                'it_CH.ISO8859-1',
  992.     'it_ch.iso88591':                       'it_CH.ISO8859-1',
  993.     'it_ch.iso885915':                      'it_CH.ISO8859-15',
  994.     'it_ch@euro':                           'it_CH.ISO8859-15',
  995.     'it_it':                                'it_IT.ISO8859-1',
  996.     'it_it.88591':                          'it_IT.ISO8859-1',
  997.     'it_it.iso88591':                       'it_IT.ISO8859-1',
  998.     'it_it.iso885915':                      'it_IT.ISO8859-15',
  999.     'it_it@euro':                           'it_IT.ISO8859-15',
  1000.     'italian':                              'it_IT.ISO8859-1',
  1001.     'italian.iso88591':                     'it_IT.ISO8859-1',
  1002.     'iu':                                   'iu_CA.NUNACOM-8',
  1003.     'iu_ca':                                'iu_CA.NUNACOM-8',
  1004.     'iu_ca.nunacom8':                       'iu_CA.NUNACOM-8',
  1005.     'iw':                                   'he_IL.ISO8859-8',
  1006.     'iw_il':                                'he_IL.ISO8859-8',
  1007.     'iw_il.iso88598':                       'he_IL.ISO8859-8',
  1008.     'ja':                                   'ja_JP.eucJP',
  1009.     'ja.jis':                               'ja_JP.JIS7',
  1010.     'ja.sjis':                              'ja_JP.SJIS',
  1011.     'ja_jp':                                'ja_JP.eucJP',
  1012.     'ja_jp.ajec':                           'ja_JP.eucJP',
  1013.     'ja_jp.euc':                            'ja_JP.eucJP',
  1014.     'ja_jp.eucjp':                          'ja_JP.eucJP',
  1015.     'ja_jp.iso-2022-jp':                    'ja_JP.JIS7',
  1016.     'ja_jp.iso2022jp':                      'ja_JP.JIS7',
  1017.     'ja_jp.jis':                            'ja_JP.JIS7',
  1018.     'ja_jp.jis7':                           'ja_JP.JIS7',
  1019.     'ja_jp.mscode':                         'ja_JP.SJIS',
  1020.     'ja_jp.sjis':                           'ja_JP.SJIS',
  1021.     'ja_jp.ujis':                           'ja_JP.eucJP',
  1022.     'japan':                                'ja_JP.eucJP',
  1023.     'japanese':                             'ja_JP.eucJP',
  1024.     'japanese-euc':                         'ja_JP.eucJP',
  1025.     'japanese.euc':                         'ja_JP.eucJP',
  1026.     'japanese.sjis':                        'ja_JP.SJIS',
  1027.     'jp_jp':                                'ja_JP.eucJP',
  1028.     'ka':                                   'ka_GE.GEORGIAN-ACADEMY',
  1029.     'ka_ge':                                'ka_GE.GEORGIAN-ACADEMY',
  1030.     'ka_ge.georgianacademy':                'ka_GE.GEORGIAN-ACADEMY',
  1031.     'ka_ge.georgianps':                     'ka_GE.GEORGIAN-PS',
  1032.     'ka_ge.georgianrs':                     'ka_GE.GEORGIAN-ACADEMY',
  1033.     'kl':                                   'kl_GL.ISO8859-1',
  1034.     'kl_gl':                                'kl_GL.ISO8859-1',
  1035.     'kl_gl.iso88591':                       'kl_GL.ISO8859-1',
  1036.     'kl_gl.iso885915':                      'kl_GL.ISO8859-15',
  1037.     'kl_gl@euro':                           'kl_GL.ISO8859-15',
  1038.     'ko':                                   'ko_KR.eucKR',
  1039.     'ko_kr':                                'ko_KR.eucKR',
  1040.     'ko_kr.euc':                            'ko_KR.eucKR',
  1041.     'ko_kr.euckr':                          'ko_KR.eucKR',
  1042.     'korean':                               'ko_KR.eucKR',
  1043.     'korean.euc':                           'ko_KR.eucKR',
  1044.     'kw':                                   'kw_GB.ISO8859-1',
  1045.     'kw_gb':                                'kw_GB.ISO8859-1',
  1046.     'kw_gb.iso88591':                       'kw_GB.ISO8859-1',
  1047.     'kw_gb.iso885914':                      'kw_GB.ISO8859-14',
  1048.     'kw_gb.iso885915':                      'kw_GB.ISO8859-15',
  1049.     'kw_gb@euro':                           'kw_GB.ISO8859-15',
  1050.     'lithuanian':                           'lt_LT.ISO8859-13',
  1051.     'lo':                                   'lo_LA.MULELAO-1',
  1052.     'lo_la':                                'lo_LA.MULELAO-1',
  1053.     'lo_la.cp1133':                         'lo_LA.IBM-CP1133',
  1054.     'lo_la.ibmcp1133':                      'lo_LA.IBM-CP1133',
  1055.     'lo_la.mulelao1':                       'lo_LA.MULELAO-1',
  1056.     'lt':                                   'lt_LT.ISO8859-13',
  1057.     'lt_lt':                                'lt_LT.ISO8859-13',
  1058.     'lt_lt.iso885913':                      'lt_LT.ISO8859-13',
  1059.     'lt_lt.iso88594':                       'lt_LT.ISO8859-4',
  1060.     'lv':                                   'lv_LV.ISO8859-13',
  1061.     'lv_lv':                                'lv_LV.ISO8859-13',
  1062.     'lv_lv.iso885913':                      'lv_LV.ISO8859-13',
  1063.     'lv_lv.iso88594':                       'lv_LV.ISO8859-4',
  1064.     'mi':                                   'mi_NZ.ISO8859-1',
  1065.     'mi_nz':                                'mi_NZ.ISO8859-1',
  1066.     'mi_nz.iso88591':                       'mi_NZ.ISO8859-1',
  1067.     'mk':                                   'mk_MK.ISO8859-5',
  1068.     'mk_mk':                                'mk_MK.ISO8859-5',
  1069.     'mk_mk.cp1251':                         'mk_MK.CP1251',
  1070.     'mk_mk.iso88595':                       'mk_MK.ISO8859-5',
  1071.     'mk_mk.microsoftcp1251':                'mk_MK.CP1251',
  1072.     'ms':                                   'ms_MY.ISO8859-1',
  1073.     'ms_my':                                'ms_MY.ISO8859-1',
  1074.     'ms_my.iso88591':                       'ms_MY.ISO8859-1',
  1075.     'mt':                                   'mt_MT.ISO8859-3',
  1076.     'mt_mt':                                'mt_MT.ISO8859-3',
  1077.     'mt_mt.iso88593':                       'mt_MT.ISO8859-3',
  1078.     'nb':                                   'nb_NO.ISO8859-1',
  1079.     'nb_no':                                'nb_NO.ISO8859-1',
  1080.     'nb_no.88591':                          'nb_NO.ISO8859-1',
  1081.     'nb_no.iso88591':                       'nb_NO.ISO8859-1',
  1082.     'nb_no.iso885915':                      'nb_NO.ISO8859-15',
  1083.     'nb_no@euro':                           'nb_NO.ISO8859-15',
  1084.     'nl':                                   'nl_NL.ISO8859-1',
  1085.     'nl_be':                                'nl_BE.ISO8859-1',
  1086.     'nl_be.88591':                          'nl_BE.ISO8859-1',
  1087.     'nl_be.iso88591':                       'nl_BE.ISO8859-1',
  1088.     'nl_be.iso885915':                      'nl_BE.ISO8859-15',
  1089.     'nl_be@euro':                           'nl_BE.ISO8859-15',
  1090.     'nl_nl':                                'nl_NL.ISO8859-1',
  1091.     'nl_nl.88591':                          'nl_NL.ISO8859-1',
  1092.     'nl_nl.iso88591':                       'nl_NL.ISO8859-1',
  1093.     'nl_nl.iso885915':                      'nl_NL.ISO8859-15',
  1094.     'nl_nl@euro':                           'nl_NL.ISO8859-15',
  1095.     'nn':                                   'nn_NO.ISO8859-1',
  1096.     'nn_no':                                'nn_NO.ISO8859-1',
  1097.     'nn_no.88591':                          'nn_NO.ISO8859-1',
  1098.     'nn_no.iso88591':                       'nn_NO.ISO8859-1',
  1099.     'nn_no.iso885915':                      'nn_NO.ISO8859-15',
  1100.     'nn_no@euro':                           'nn_NO.ISO8859-15',
  1101.     'no':                                   'no_NO.ISO8859-1',
  1102.     'no@nynorsk':                           'ny_NO.ISO8859-1',
  1103.     'no_no':                                'no_NO.ISO8859-1',
  1104.     'no_no.88591':                          'no_NO.ISO8859-1',
  1105.     'no_no.iso88591':                       'no_NO.ISO8859-1',
  1106.     'no_no.iso885915':                      'no_NO.ISO8859-15',
  1107.     'no_no@euro':                           'no_NO.ISO8859-15',
  1108.     'norwegian':                            'no_NO.ISO8859-1',
  1109.     'norwegian.iso88591':                   'no_NO.ISO8859-1',
  1110.     'ny':                                   'ny_NO.ISO8859-1',
  1111.     'ny_no':                                'ny_NO.ISO8859-1',
  1112.     'ny_no.88591':                          'ny_NO.ISO8859-1',
  1113.     'ny_no.iso88591':                       'ny_NO.ISO8859-1',
  1114.     'ny_no.iso885915':                      'ny_NO.ISO8859-15',
  1115.     'ny_no@euro':                           'ny_NO.ISO8859-15',
  1116.     'nynorsk':                              'nn_NO.ISO8859-1',
  1117.     'oc':                                   'oc_FR.ISO8859-1',
  1118.     'oc_fr':                                'oc_FR.ISO8859-1',
  1119.     'oc_fr.iso88591':                       'oc_FR.ISO8859-1',
  1120.     'oc_fr.iso885915':                      'oc_FR.ISO8859-15',
  1121.     'oc_fr@euro':                           'oc_FR.ISO8859-15',
  1122.     'pd':                                   'pd_US.ISO8859-1',
  1123.     'pd_de':                                'pd_DE.ISO8859-1',
  1124.     'pd_de.iso88591':                       'pd_DE.ISO8859-1',
  1125.     'pd_de.iso885915':                      'pd_DE.ISO8859-15',
  1126.     'pd_de@euro':                           'pd_DE.ISO8859-15',
  1127.     'pd_us':                                'pd_US.ISO8859-1',
  1128.     'pd_us.iso88591':                       'pd_US.ISO8859-1',
  1129.     'pd_us.iso885915':                      'pd_US.ISO8859-15',
  1130.     'pd_us@euro':                           'pd_US.ISO8859-15',
  1131.     'ph':                                   'ph_PH.ISO8859-1',
  1132.     'ph_ph':                                'ph_PH.ISO8859-1',
  1133.     'ph_ph.iso88591':                       'ph_PH.ISO8859-1',
  1134.     'pl':                                   'pl_PL.ISO8859-2',
  1135.     'pl_pl':                                'pl_PL.ISO8859-2',
  1136.     'pl_pl.iso88592':                       'pl_PL.ISO8859-2',
  1137.     'polish':                               'pl_PL.ISO8859-2',
  1138.     'portuguese':                           'pt_PT.ISO8859-1',
  1139.     'portuguese.iso88591':                  'pt_PT.ISO8859-1',
  1140.     'portuguese_brazil':                    'pt_BR.ISO8859-1',
  1141.     'portuguese_brazil.8859':               'pt_BR.ISO8859-1',
  1142.     'posix':                                'C',
  1143.     'posix-utf2':                           'C',
  1144.     'pp':                                   'pp_AN.ISO8859-1',
  1145.     'pp_an':                                'pp_AN.ISO8859-1',
  1146.     'pp_an.iso88591':                       'pp_AN.ISO8859-1',
  1147.     'pt':                                   'pt_PT.ISO8859-1',
  1148.     'pt_br':                                'pt_BR.ISO8859-1',
  1149.     'pt_br.88591':                          'pt_BR.ISO8859-1',
  1150.     'pt_br.iso88591':                       'pt_BR.ISO8859-1',
  1151.     'pt_br.iso885915':                      'pt_BR.ISO8859-15',
  1152.     'pt_br@euro':                           'pt_BR.ISO8859-15',
  1153.     'pt_pt':                                'pt_PT.ISO8859-1',
  1154.     'pt_pt.88591':                          'pt_PT.ISO8859-1',
  1155.     'pt_pt.iso88591':                       'pt_PT.ISO8859-1',
  1156.     'pt_pt.iso885915':                      'pt_PT.ISO8859-15',
  1157.     'pt_pt.utf8@euro':                      'pt_PT.UTF-8',
  1158.     'pt_pt@euro':                           'pt_PT.ISO8859-15',
  1159.     'ro':                                   'ro_RO.ISO8859-2',
  1160.     'ro_ro':                                'ro_RO.ISO8859-2',
  1161.     'ro_ro.iso88592':                       'ro_RO.ISO8859-2',
  1162.     'romanian':                             'ro_RO.ISO8859-2',
  1163.     'ru':                                   'ru_RU.ISO8859-5',
  1164.     'ru_ru':                                'ru_RU.ISO8859-5',
  1165.     'ru_ru.cp1251':                         'ru_RU.CP1251',
  1166.     'ru_ru.iso88595':                       'ru_RU.ISO8859-5',
  1167.     'ru_ru.koi8r':                          'ru_RU.KOI8-R',
  1168.     'ru_ru.microsoftcp1251':                'ru_RU.CP1251',
  1169.     'ru_ua':                                'ru_UA.KOI8-U',
  1170.     'ru_ua.cp1251':                         'ru_UA.CP1251',
  1171.     'ru_ua.koi8u':                          'ru_UA.KOI8-U',
  1172.     'ru_ua.microsoftcp1251':                'ru_UA.CP1251',
  1173.     'rumanian':                             'ro_RO.ISO8859-2',
  1174.     'russian':                              'ru_RU.ISO8859-5',
  1175.     'se_no':                                'se_NO.UTF-8',
  1176.     'serbocroatian':                        'sh_YU.ISO8859-2',
  1177.     'sh':                                   'sh_YU.ISO8859-2',
  1178.     'sh_hr':                                'sh_HR.ISO8859-2',
  1179.     'sh_hr.iso88592':                       'sh_HR.ISO8859-2',
  1180.     'sh_sp':                                'sh_YU.ISO8859-2',
  1181.     'sh_yu':                                'sh_YU.ISO8859-2',
  1182.     'sk':                                   'sk_SK.ISO8859-2',
  1183.     'sk_sk':                                'sk_SK.ISO8859-2',
  1184.     'sk_sk.iso88592':                       'sk_SK.ISO8859-2',
  1185.     'sl':                                   'sl_SI.ISO8859-2',
  1186.     'sl_cs':                                'sl_CS.ISO8859-2',
  1187.     'sl_si':                                'sl_SI.ISO8859-2',
  1188.     'sl_si.iso88592':                       'sl_SI.ISO8859-2',
  1189.     'slovak':                               'sk_SK.ISO8859-2',
  1190.     'slovene':                              'sl_SI.ISO8859-2',
  1191.     'slovenian':                            'sl_SI.ISO8859-2',
  1192.     'sp':                                   'sp_YU.ISO8859-5',
  1193.     'sp_yu':                                'sp_YU.ISO8859-5',
  1194.     'spanish':                              'es_ES.ISO8859-1',
  1195.     'spanish.iso88591':                     'es_ES.ISO8859-1',
  1196.     'spanish_spain':                        'es_ES.ISO8859-1',
  1197.     'spanish_spain.8859':                   'es_ES.ISO8859-1',
  1198.     'sq':                                   'sq_AL.ISO8859-2',
  1199.     'sq_al':                                'sq_AL.ISO8859-2',
  1200.     'sq_al.iso88592':                       'sq_AL.ISO8859-2',
  1201.     'sr':                                   'sr_YU.ISO8859-5',
  1202.     'sr@cyrillic':                          'sr_YU.ISO8859-5',
  1203.     'sr_sp':                                'sr_SP.ISO8859-2',
  1204.     'sr_yu':                                'sr_YU.ISO8859-5',
  1205.     'sr_yu.cp1251@cyrillic':                'sr_YU.CP1251',
  1206.     'sr_yu.iso88592':                       'sr_YU.ISO8859-2',
  1207.     'sr_yu.iso88595':                       'sr_YU.ISO8859-5',
  1208.     'sr_yu.iso88595@cyrillic':              'sr_YU.ISO8859-5',
  1209.     'sr_yu.microsoftcp1251@cyrillic':       'sr_YU.CP1251',
  1210.     'sr_yu.utf8@cyrillic':                  'sr_YU.UTF-8',
  1211.     'sr_yu@cyrillic':                       'sr_YU.ISO8859-5',
  1212.     'sv':                                   'sv_SE.ISO8859-1',
  1213.     'sv_fi':                                'sv_FI.ISO8859-1',
  1214.     'sv_fi.iso88591':                       'sv_FI.ISO8859-1',
  1215.     'sv_fi.iso885915':                      'sv_FI.ISO8859-15',
  1216.     'sv_fi@euro':                           'sv_FI.ISO8859-15',
  1217.     'sv_se':                                'sv_SE.ISO8859-1',
  1218.     'sv_se.88591':                          'sv_SE.ISO8859-1',
  1219.     'sv_se.iso88591':                       'sv_SE.ISO8859-1',
  1220.     'sv_se.iso885915':                      'sv_SE.ISO8859-15',
  1221.     'sv_se@euro':                           'sv_SE.ISO8859-15',
  1222.     'swedish':                              'sv_SE.ISO8859-1',
  1223.     'swedish.iso88591':                     'sv_SE.ISO8859-1',
  1224.     'ta':                                   'ta_IN.TSCII-0',
  1225.     'ta_in':                                'ta_IN.TSCII-0',
  1226.     'ta_in.tscii':                          'ta_IN.TSCII-0',
  1227.     'ta_in.tscii0':                         'ta_IN.TSCII-0',
  1228.     'tg':                                   'tg_TJ.KOI8-C',
  1229.     'tg_tj':                                'tg_TJ.KOI8-C',
  1230.     'tg_tj.koi8c':                          'tg_TJ.KOI8-C',
  1231.     'th':                                   'th_TH.ISO8859-11',
  1232.     'th_th':                                'th_TH.ISO8859-11',
  1233.     'th_th.iso885911':                      'th_TH.ISO8859-11',
  1234.     'th_th.tactis':                         'th_TH.TIS620',
  1235.     'th_th.tis620':                         'th_TH.TIS620',
  1236.     'thai':                                 'th_TH.ISO8859-11',
  1237.     'tl':                                   'tl_PH.ISO8859-1',
  1238.     'tl_ph':                                'tl_PH.ISO8859-1',
  1239.     'tl_ph.iso88591':                       'tl_PH.ISO8859-1',
  1240.     'tr':                                   'tr_TR.ISO8859-9',
  1241.     'tr_tr':                                'tr_TR.ISO8859-9',
  1242.     'tr_tr.iso88599':                       'tr_TR.ISO8859-9',
  1243.     'tt':                                   'tt_RU.TATAR-CYR',
  1244.     'tt_ru':                                'tt_RU.TATAR-CYR',
  1245.     'tt_ru.koi8c':                          'tt_RU.KOI8-C',
  1246.     'tt_ru.tatarcyr':                       'tt_RU.TATAR-CYR',
  1247.     'turkish':                              'tr_TR.ISO8859-9',
  1248.     'turkish.iso88599':                     'tr_TR.ISO8859-9',
  1249.     'uk':                                   'uk_UA.KOI8-U',
  1250.     'uk_ua':                                'uk_UA.KOI8-U',
  1251.     'uk_ua.cp1251':                         'uk_UA.CP1251',
  1252.     'uk_ua.iso88595':                       'uk_UA.ISO8859-5',
  1253.     'uk_ua.koi8u':                          'uk_UA.KOI8-U',
  1254.     'uk_ua.microsoftcp1251':                'uk_UA.CP1251',
  1255.     'univ':                                 'en_US.utf',
  1256.     'universal':                            'en_US.utf',
  1257.     'universal.utf8@ucs4':                  'en_US.UTF-8',
  1258.     'ur':                                   'ur_PK.CP1256',
  1259.     'ur_pk':                                'ur_PK.CP1256',
  1260.     'ur_pk.cp1256':                         'ur_PK.CP1256',
  1261.     'ur_pk.microsoftcp1256':                'ur_PK.CP1256',
  1262.     'uz':                                   'uz_UZ.UTF-8',
  1263.     'uz_uz':                                'uz_UZ.UTF-8',
  1264.     'vi':                                   'vi_VN.TCVN',
  1265.     'vi_vn':                                'vi_VN.TCVN',
  1266.     'vi_vn.tcvn':                           'vi_VN.TCVN',
  1267.     'vi_vn.tcvn5712':                       'vi_VN.TCVN',
  1268.     'vi_vn.viscii':                         'vi_VN.VISCII',
  1269.     'vi_vn.viscii111':                      'vi_VN.VISCII',
  1270.     'wa':                                   'wa_BE.ISO8859-1',
  1271.     'wa_be':                                'wa_BE.ISO8859-1',
  1272.     'wa_be.iso88591':                       'wa_BE.ISO8859-1',
  1273.     'wa_be.iso885915':                      'wa_BE.ISO8859-15',
  1274.     'wa_be@euro':                           'wa_BE.ISO8859-15',
  1275.     'yi':                                   'yi_US.CP1255',
  1276.     'yi_us':                                'yi_US.CP1255',
  1277.     'yi_us.cp1255':                         'yi_US.CP1255',
  1278.     'yi_us.microsoftcp1255':                'yi_US.CP1255',
  1279.     'zh':                                   'zh_CN.eucCN',
  1280.     'zh_cn':                                'zh_CN.gb2312',
  1281.     'zh_cn.big5':                           'zh_TW.big5',
  1282.     'zh_cn.euc':                            'zh_CN.eucCN',
  1283.     'zh_cn.gb18030':                        'zh_CN.gb18030',
  1284.     'zh_cn.gb2312':                         'zh_CN.gb2312',
  1285.     'zh_cn.gbk':                            'zh_CN.gbk',
  1286.     'zh_hk':                                'zh_HK.big5hkscs',
  1287.     'zh_hk.big5':                           'zh_HK.big5',
  1288.     'zh_hk.big5hkscs':                      'zh_HK.big5hkscs',
  1289.     'zh_tw':                                'zh_TW.big5',
  1290.     'zh_tw.big5':                           'zh_TW.big5',
  1291.     'zh_tw.euc':                            'zh_TW.eucTW',
  1292. }
  1293.  
  1294. #
  1295. # This maps Windows language identifiers to locale strings.
  1296. #
  1297. # This list has been updated from
  1298. # http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/nls_238z.asp
  1299. # to include every locale up to Windows XP.
  1300. #
  1301. # NOTE: this mapping is incomplete.  If your language is missing, please
  1302. # submit a bug report to Python bug manager, which you can find via:
  1303. #     http://www.python.org/dev/
  1304. # Make sure you include the missing language identifier and the suggested
  1305. # locale code.
  1306. #
  1307.  
  1308. windows_locale = {
  1309.     0x0436: "af_ZA", # Afrikaans
  1310.     0x041c: "sq_AL", # Albanian
  1311.     0x0401: "ar_SA", # Arabic - Saudi Arabia
  1312.     0x0801: "ar_IQ", # Arabic - Iraq
  1313.     0x0c01: "ar_EG", # Arabic - Egypt
  1314.     0x1001: "ar_LY", # Arabic - Libya
  1315.     0x1401: "ar_DZ", # Arabic - Algeria
  1316.     0x1801: "ar_MA", # Arabic - Morocco
  1317.     0x1c01: "ar_TN", # Arabic - Tunisia
  1318.     0x2001: "ar_OM", # Arabic - Oman
  1319.     0x2401: "ar_YE", # Arabic - Yemen
  1320.     0x2801: "ar_SY", # Arabic - Syria
  1321.     0x2c01: "ar_JO", # Arabic - Jordan
  1322.     0x3001: "ar_LB", # Arabic - Lebanon
  1323.     0x3401: "ar_KW", # Arabic - Kuwait
  1324.     0x3801: "ar_AE", # Arabic - United Arab Emirates
  1325.     0x3c01: "ar_BH", # Arabic - Bahrain
  1326.     0x4001: "ar_QA", # Arabic - Qatar
  1327.     0x042b: "hy_AM", # Armenian
  1328.     0x042c: "az_AZ", # Azeri Latin
  1329.     0x082c: "az_AZ", # Azeri - Cyrillic
  1330.     0x042d: "eu_ES", # Basque
  1331.     0x0423: "be_BY", # Belarusian
  1332.     0x0445: "bn_IN", # Begali
  1333.     0x201a: "bs_BA", # Bosnian
  1334.     0x141a: "bs_BA", # Bosnian - Cyrillic
  1335.     0x047e: "br_FR", # Breton - France
  1336.     0x0402: "bg_BG", # Bulgarian
  1337.     0x0403: "ca_ES", # Catalan
  1338.     0x0004: "zh_CHS",# Chinese - Simplified
  1339.     0x0404: "zh_TW", # Chinese - Taiwan
  1340.     0x0804: "zh_CN", # Chinese - PRC
  1341.     0x0c04: "zh_HK", # Chinese - Hong Kong S.A.R.
  1342.     0x1004: "zh_SG", # Chinese - Singapore
  1343.     0x1404: "zh_MO", # Chinese - Macao S.A.R.
  1344.     0x7c04: "zh_CHT",# Chinese - Traditional
  1345.     0x041a: "hr_HR", # Croatian
  1346.     0x101a: "hr_BA", # Croatian - Bosnia
  1347.     0x0405: "cs_CZ", # Czech
  1348.     0x0406: "da_DK", # Danish
  1349.     0x048c: "gbz_AF",# Dari - Afghanistan
  1350.     0x0465: "div_MV",# Divehi - Maldives
  1351.     0x0413: "nl_NL", # Dutch - The Netherlands
  1352.     0x0813: "nl_BE", # Dutch - Belgium
  1353.     0x0409: "en_US", # English - United States
  1354.     0x0809: "en_GB", # English - United Kingdom
  1355.     0x0c09: "en_AU", # English - Australia
  1356.     0x1009: "en_CA", # English - Canada
  1357.     0x1409: "en_NZ", # English - New Zealand
  1358.     0x1809: "en_IE", # English - Ireland
  1359.     0x1c09: "en_ZA", # English - South Africa
  1360.     0x2009: "en_JA", # English - Jamaica
  1361.     0x2409: "en_CB", # English - Carribbean
  1362.     0x2809: "en_BZ", # English - Belize
  1363.     0x2c09: "en_TT", # English - Trinidad
  1364.     0x3009: "en_ZW", # English - Zimbabwe
  1365.     0x3409: "en_PH", # English - Phillippines
  1366.     0x0425: "et_EE", # Estonian
  1367.     0x0438: "fo_FO", # Faroese
  1368.     0x0464: "fil_PH",# Filipino
  1369.     0x040b: "fi_FI", # Finnish
  1370.     0x040c: "fr_FR", # French - France
  1371.     0x080c: "fr_BE", # French - Belgium
  1372.     0x0c0c: "fr_CA", # French - Canada
  1373.     0x100c: "fr_CH", # French - Switzerland
  1374.     0x140c: "fr_LU", # French - Luxembourg
  1375.     0x180c: "fr_MC", # French - Monaco
  1376.     0x0462: "fy_NL", # Frisian - Netherlands
  1377.     0x0456: "gl_ES", # Galician
  1378.     0x0437: "ka_GE", # Georgian
  1379.     0x0407: "de_DE", # German - Germany
  1380.     0x0807: "de_CH", # German - Switzerland
  1381.     0x0c07: "de_AT", # German - Austria
  1382.     0x1007: "de_LU", # German - Luxembourg
  1383.     0x1407: "de_LI", # German - Liechtenstein
  1384.     0x0408: "el_GR", # Greek
  1385.     0x0447: "gu_IN", # Gujarati
  1386.     0x040d: "he_IL", # Hebrew
  1387.     0x0439: "hi_IN", # Hindi
  1388.     0x040e: "hu_HU", # Hungarian
  1389.     0x040f: "is_IS", # Icelandic
  1390.     0x0421: "id_ID", # Indonesian
  1391.     0x045d: "iu_CA", # Inuktitut
  1392.     0x085d: "iu_CA", # Inuktitut - Latin
  1393.     0x083c: "ga_IE", # Irish - Ireland
  1394.     0x0434: "xh_ZA", # Xhosa - South Africa
  1395.     0x0435: "zu_ZA", # Zulu
  1396.     0x0410: "it_IT", # Italian - Italy
  1397.     0x0810: "it_CH", # Italian - Switzerland
  1398.     0x0411: "ja_JP", # Japanese
  1399.     0x044b: "kn_IN", # Kannada - India
  1400.     0x043f: "kk_KZ", # Kazakh
  1401.     0x0457: "kok_IN",# Konkani
  1402.     0x0412: "ko_KR", # Korean
  1403.     0x0440: "ky_KG", # Kyrgyz
  1404.     0x0426: "lv_LV", # Latvian
  1405.     0x0427: "lt_LT", # Lithuanian
  1406.     0x046e: "lb_LU", # Luxembourgish
  1407.     0x042f: "mk_MK", # FYRO Macedonian
  1408.     0x043e: "ms_MY", # Malay - Malaysia
  1409.     0x083e: "ms_BN", # Malay - Brunei
  1410.     0x044c: "ml_IN", # Malayalam - India
  1411.     0x043a: "mt_MT", # Maltese
  1412.     0x0481: "mi_NZ", # Maori
  1413.     0x047a: "arn_CL",# Mapudungun
  1414.     0x044e: "mr_IN", # Marathi
  1415.     0x047c: "moh_CA",# Mohawk - Canada
  1416.     0x0450: "mn_MN", # Mongolian
  1417.     0x0461: "ne_NP", # Nepali
  1418.     0x0414: "nb_NO", # Norwegian - Bokmal
  1419.     0x0814: "nn_NO", # Norwegian - Nynorsk
  1420.     0x0482: "oc_FR", # Occitan - France
  1421.     0x0448: "or_IN", # Oriya - India
  1422.     0x0463: "ps_AF", # Pashto - Afghanistan
  1423.     0x0429: "fa_IR", # Persian
  1424.     0x0415: "pl_PL", # Polish
  1425.     0x0416: "pt_BR", # Portuguese - Brazil
  1426.     0x0816: "pt_PT", # Portuguese - Portugal
  1427.     0x0446: "pa_IN", # Punjabi
  1428.     0x046b: "quz_BO",# Quechua (Bolivia)
  1429.     0x086b: "quz_EC",# Quechua (Ecuador)
  1430.     0x0c6b: "quz_PE",# Quechua (Peru)
  1431.     0x0418: "ro_RO", # Romanian - Romania
  1432.     0x0417: "rm_CH", # Raeto-Romanese
  1433.     0x0419: "ru_RU", # Russian
  1434.     0x243b: "smn_FI",# Sami Finland
  1435.     0x103b: "smj_NO",# Sami Norway
  1436.     0x143b: "smj_SE",# Sami Sweden
  1437.     0x043b: "se_NO", # Sami Northern Norway
  1438.     0x083b: "se_SE", # Sami Northern Sweden
  1439.     0x0c3b: "se_FI", # Sami Northern Finland
  1440.     0x203b: "sms_FI",# Sami Skolt
  1441.     0x183b: "sma_NO",# Sami Southern Norway
  1442.     0x1c3b: "sma_SE",# Sami Southern Sweden
  1443.     0x044f: "sa_IN", # Sanskrit
  1444.     0x0c1a: "sr_SP", # Serbian - Cyrillic
  1445.     0x1c1a: "sr_BA", # Serbian - Bosnia Cyrillic
  1446.     0x081a: "sr_SP", # Serbian - Latin
  1447.     0x181a: "sr_BA", # Serbian - Bosnia Latin
  1448.     0x046c: "ns_ZA", # Northern Sotho
  1449.     0x0432: "tn_ZA", # Setswana - Southern Africa
  1450.     0x041b: "sk_SK", # Slovak
  1451.     0x0424: "sl_SI", # Slovenian
  1452.     0x040a: "es_ES", # Spanish - Spain
  1453.     0x080a: "es_MX", # Spanish - Mexico
  1454.     0x0c0a: "es_ES", # Spanish - Spain (Modern)
  1455.     0x100a: "es_GT", # Spanish - Guatemala
  1456.     0x140a: "es_CR", # Spanish - Costa Rica
  1457.     0x180a: "es_PA", # Spanish - Panama
  1458.     0x1c0a: "es_DO", # Spanish - Dominican Republic
  1459.     0x200a: "es_VE", # Spanish - Venezuela
  1460.     0x240a: "es_CO", # Spanish - Colombia
  1461.     0x280a: "es_PE", # Spanish - Peru
  1462.     0x2c0a: "es_AR", # Spanish - Argentina
  1463.     0x300a: "es_EC", # Spanish - Ecuador
  1464.     0x340a: "es_CL", # Spanish - Chile
  1465.     0x380a: "es_UR", # Spanish - Uruguay
  1466.     0x3c0a: "es_PY", # Spanish - Paraguay
  1467.     0x400a: "es_BO", # Spanish - Bolivia
  1468.     0x440a: "es_SV", # Spanish - El Salvador
  1469.     0x480a: "es_HN", # Spanish - Honduras
  1470.     0x4c0a: "es_NI", # Spanish - Nicaragua
  1471.     0x500a: "es_PR", # Spanish - Puerto Rico
  1472.     0x0441: "sw_KE", # Swahili
  1473.     0x041d: "sv_SE", # Swedish - Sweden
  1474.     0x081d: "sv_FI", # Swedish - Finland
  1475.     0x045a: "syr_SY",# Syriac
  1476.     0x0449: "ta_IN", # Tamil
  1477.     0x0444: "tt_RU", # Tatar
  1478.     0x044a: "te_IN", # Telugu
  1479.     0x041e: "th_TH", # Thai
  1480.     0x041f: "tr_TR", # Turkish
  1481.     0x0422: "uk_UA", # Ukrainian
  1482.     0x0420: "ur_PK", # Urdu
  1483.     0x0820: "ur_IN", # Urdu - India
  1484.     0x0443: "uz_UZ", # Uzbek - Latin
  1485.     0x0843: "uz_UZ", # Uzbek - Cyrillic
  1486.     0x042a: "vi_VN", # Vietnamese
  1487.     0x0452: "cy_GB", # Welsh
  1488. }
  1489.  
  1490. def _print_locale():
  1491.  
  1492.     """ Test function.
  1493.     """
  1494.     categories = {}
  1495.     def _init_categories(categories=categories):
  1496.         for k,v in globals().items():
  1497.             if k[:3] == 'LC_':
  1498.                 categories[k] = v
  1499.     _init_categories()
  1500.     del categories['LC_ALL']
  1501.  
  1502.     print 'Locale defaults as determined by getdefaultlocale():'
  1503.     print '-'*72
  1504.     lang, enc = getdefaultlocale()
  1505.     print 'Language: ', lang or '(undefined)'
  1506.     print 'Encoding: ', enc or '(undefined)'
  1507.     print
  1508.  
  1509.     print 'Locale settings on startup:'
  1510.     print '-'*72
  1511.     for name,category in categories.items():
  1512.         print name, '...'
  1513.         lang, enc = getlocale(category)
  1514.         print '   Language: ', lang or '(undefined)'
  1515.         print '   Encoding: ', enc or '(undefined)'
  1516.         print
  1517.  
  1518.     print
  1519.     print 'Locale settings after calling resetlocale():'
  1520.     print '-'*72
  1521.     resetlocale()
  1522.     for name,category in categories.items():
  1523.         print name, '...'
  1524.         lang, enc = getlocale(category)
  1525.         print '   Language: ', lang or '(undefined)'
  1526.         print '   Encoding: ', enc or '(undefined)'
  1527.         print
  1528.  
  1529.     try:
  1530.         setlocale(LC_ALL, "")
  1531.     except:
  1532.         print 'NOTE:'
  1533.         print 'setlocale(LC_ALL, "") does not support the default locale'
  1534.         print 'given in the OS environment variables.'
  1535.     else:
  1536.         print
  1537.         print 'Locale settings after calling setlocale(LC_ALL, ""):'
  1538.         print '-'*72
  1539.         for name,category in categories.items():
  1540.             print name, '...'
  1541.             lang, enc = getlocale(category)
  1542.             print '   Language: ', lang or '(undefined)'
  1543.             print '   Encoding: ', enc or '(undefined)'
  1544.             print
  1545.  
  1546. ###
  1547.  
  1548. try:
  1549.     LC_MESSAGES
  1550. except NameError:
  1551.     pass
  1552. else:
  1553.     __all__.append("LC_MESSAGES")
  1554.  
  1555. if __name__=='__main__':
  1556.     print 'Locale aliasing:'
  1557.     print
  1558.     _print_locale()
  1559.     print
  1560.     print 'Number formatting:'
  1561.     print
  1562.     _test()
  1563.